// AudioManager.ts
// 音频管理器类 - 用于全局控制背景音乐

// 导入必要的 Cocos Creator 模块
import { _decorator, Component, Node, AudioSource, AudioClip, director } from 'cc';
const { ccclass, property } = _decorator;

/**
 * 音频管理器类，使用单例模式实现
 * 功能：
 * 1. 播放背景音乐
 * 2. 控制音量
 * 3. 暂停/恢复/停止背景音乐
 * 4. 跨场景保持音乐播放
 */
@ccclass('AudioManager')  // 使用装饰器声明为CC类
export class AudioManager extends Component {

    // 背景音乐专用通道
    private _bgmSource: AudioSource;


    // 音效对象池
    private _sfxPool: AudioSource[] = [];
    private _maxChannels = 5; // 最大同时音效数
    
    // 静态实例引用，实现单例模式
    private static instance: AudioManager = null;
    
    // AudioSource组件引用，用于播放音频
    private audioSource: AudioSource = null;

    /**
     * 节点加载时的回调
     * 实现单例逻辑和常驻节点设置
     */
    onLoad() {
        // 确保只有一个实例
        if (AudioManager.instance && AudioManager.instance !== this) {
            this.node.destroy();
            return;
        }
        
        AudioManager.instance = this;

        // 初始化BGM通道
        this._bgmSource = this.node.addComponent(AudioSource);

        // 初始化音效池
        for (let i = 0; i < this._maxChannels; i++) {
            const node = new Node(`SFX_Channel_${i}`);
            node.parent = this.node;
            this._sfxPool.push(node.addComponent(AudioSource));
        }
    }
    
    // 安全的单例访问方法
    public static getInstance(): AudioManager {
        if (!this.instance) {
            // 创建常驻节点
            const audioNode = new Node('AudioManager');
            director.addPersistRootNode(audioNode);
            this.instance = audioNode.addComponent(AudioManager);
        }
        return this.instance;
    }

    /**
     * 播放背景音乐
     * @param clip 音频剪辑资源
     * @param volume 音量大小(0-1)，默认0.5
     * @param loop 是否循环播放，默认true
     */
    public playBGM(clip:AudioClip, volume: number = 0.5) {
        if(clip == null)
        {
            console.error("Can not Play BGM ,Dont has gameBGM !");
            return;
        }
        this._bgmSource.stop();
        this._bgmSource.clip = clip;
        this._bgmSource.volume = volume;
        this._bgmSource.loop = true;
        this._bgmSource.play();
    }
    
    /**
     * 设置背景音乐音量
     * @param volume 音量大小(0-1)
     */
    public setBGMVolume(volume: number) {
        this.audioSource.volume = volume;
    }
    
    /**
     * 暂停背景音乐播放
     */
    public pauseBGM() {
        this.audioSource.pause();
    }
    
    /**
     * 恢复背景音乐播放
     */
    public resumeBGM() {
        this.audioSource.play();
    }
    
    /**
     * 停止背景音乐播放
     */
    public stopBGM() {
        // 先关闭循环防止自动重播
        this.audioSource.loop = false;

        this.audioSource.stop();
    }


       // 播放音效（自动选择空闲通道）
    playSFX(clip: AudioClip, volume = 1.0) {
        console.log("playSFX 11111111111111111111111111111111111 ");
        const source = this._getAvailableSource();
        if (clip == null) 
        {
            console.error("playSFX Erro , Not Has clip");
            return;
        }

        this.resetsfxPool(source);

        source.enabled = true;
        source.clip = clip;
        source.volume = volume;
        source.loop = false;
        source.playOneShot(clip);
        
    }

    // 获取可用音效通道
    private _getAvailableSource(): AudioSource | null {
        return this._sfxPool.find(source => !source.playing) || null;
    }

    //重置音效
    public resetsfxPool(source:AudioSource)
    {
        source.enabled = false;
        source.clip = null;
        source.volume = 0;
    }

    public resetAllsfxPool()
    {
        for (let index = 0; index < this._sfxPool.length; index++) {
            const element = this._sfxPool[index];
            if(element)
            {
                this.resetsfxPool(element);
            }
        }
    }

    /**
     * 销毁音频管理器
     * 注意：需要在游戏退出或不需要时手动调用
     */
    public destroyAudioManager() {
        // 从常驻节点列表中移除
        director.removePersistRootNode(this.node);
        
        // 销毁节点
        this.node.destroy();
        
        // 重置单例引用
        AudioManager.instance = null;
    }
}

// ====================== 使用示例 ======================
// 1. 在场景中创建一个空节点，添加此脚本组件
// 2. 使用方法：
//    // 获取音频管理器实例
//    const audioManager = AudioManager.instance;
//    
//    // 播放背景音乐
//    audioManager.playBGM(bgmClip, 0.7, true);
//    
//    // 设置音量
//    audioManager.setBGMVolume(0.5);
//    
//    // 暂停音乐
//    audioManager.pauseBGM();
//    
//    // 恢复音乐
//    audioManager.resumeBGM();
//    
//    // 停止音乐
//    audioManager.stopBGM();
//    
//    // 销毁管理器(谨慎使用)
//    audioManager.destroyAudioManager();